#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <errno.h>

//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    int i = 5;
//    while(i)
//    {
//      printf("Child is running,pid:%d,ppid:%d\n",getpid(),getppid());
//      sleep(1);
//      --i;
//    }
//    printf("子进程准备退出，子进程为僵尸进程\n");
//    exit(1);
//  }
//  
//  int tmp = 0;
//  pid_t rid = waitpid(id,&tmp,0);
//  if(rid > 0)
//  {
//    printf("wait success,rid:%d,退出信息：%d,异常信号编号：%d,进程退出码；%d\n",rid,tmp,tmp&0x7f,(tmp>>8)&0xff);
//  }
//
//}
//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    int i = 5;
//    while(i)
//    {
//      printf("我是子进程，子进程运行,pid:%d,ppid:%d,i:%d\n",getpid(),getppid(),i);
//      --i;
//      sleep(1);
//    }
//    printf("子进程准备退出\n");
//    sleep(2);
//    exit(123);
//  }
//  //父进程
//  int temp = 0;
//  pid_t rid = waitpid(id,&temp,0);
//  if(WIFEXITED(temp))
//  {
//    printf("父进程获取到子进程信息,rid:%d,status:%d,进程退出码:%d\n",rid,temp,WEXITSTATUS(temp));
//  }
//  else{
//    printf("子进程没有正常退出\n");
//  }
//  return 0;
//}
//#define NUM 5
//
//typedef void(*func)();
//
//func task[NUM];
//void printLog()
//{
//  printf("this is function print log\n");
//}
//void printNPC()
//{
//  printf("this is function print NPC\n");
//}
//void printNET()
//{
//  printf("this is function print NET\n");
//}
//void InitTask()
//{
//  task[0] = printLog;
//  task[1] = printNPC;
//  task[2] = printNET;
//  task[3] = NULL;
//}
//void excuteTask()
//{
//  for(int i = 0;task[i];++i)task[i]();
//}
//int main()
//{
//  InitTask();
//  pid_t id = fork();
//  if(id == 0)
//  {
//    int i = 5;
//    while(i)
//    {
//      printf("子进程运行,pid:%d,ppid:%d,i:%d\n",getpid(),getppid(),i);
//      --i;
//      sleep(1);
//    }
//    printf("子进程准备退出\n");
//    sleep(2);
//    exit(123);
//  }
//  //父进程
//  int temp = 0;
//  while(1)
//  {
//  pid_t rid = waitpid(id,&temp,WNOHANG);
//  if(rid >0)
//  {  
//    printf("父进程获取到子进程信息,rid:%d,status:%d,进程退出码:%d\n",rid,temp,WEXITSTATUS(temp));
//    break;
//  }
//  else if(rid ==0)
//  {
//    printf("子进程正在运行\n");
//    printf("---------------\n");
//    excuteTask();
//  }
//  else{
//    perror("waitpid is error\n");
//  }
//  sleep(1);
//  }
//
//  return 0;
//}
int main()
{
  pid_t id = fork();
  if(id == 0)
  {
    int i = 5;
    while(i)
    {
      printf("我是子进程，子进程运行,pid:%d,ppid:%d,i:%d\n",getpid(),getppid(),i);
      --i;
      sleep(1);
    }
    printf("子进程准备退出\n");
    sleep(2);
    exit(123);
  }
  //父进程
  int temp = 0;
  while(1)
  {
  pid_t rid = waitpid(id,&temp,WNOHANG);
  if(rid >0)
  {  
    printf("父进程获取到子进程信息,rid:%d,status:%d,进程退出码:%d\n",rid,temp,WEXITSTATUS(temp));
    break;
  }
  else if(rid ==0)
  {
    printf("子进程正在运行\n");
  }
  else{
    perror("waitpid is error\n");
  }
  sleep(1);
  }
  return 0;
}

